With the react-spring library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with react-spring.
Parallax
The Parallax
component lets us create a scroll container.
Inside it, we add the ParallaxLayer
component to let react-spring take care of moving them.
For example, we can write:
import React from "react";
import { Parallax, ParallaxLayer } from "react-spring/renderprops-addons";
export default function App() {
return (
<div>
<Parallax
pages={2}
scrolling={false}
horizontal
ref={(ref) => (this.parallax = ref)}
>
<ParallaxLayer
offset={0}
speed={0.1}
onClick={() => this.parallax.scrollTo(1)}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center"
}}
>
<img
src="https://i.picsum.photos/id/23/200/300.jpg?hmac=NFze_vylqSEkX21kuRKSe8pp6Em-4ETfOE-oyLVCvJo"
style={{ width: "20%" }}
/>
</ParallaxLayer>
<ParallaxLayer
offset={1}
speed={0.1}
onClick={() => this.parallax.scrollTo(0)}
style={{
display: "flex",
alignItems: "center",
justifyContent: "center"
}}
>
<img
src="https://i.picsum.photos/id/24/200/300.jpg?hmac=UogR0hFxP5yLDwcZpCawObw8Bzm9vnzci_7eMrbqn_s"
style={{ width: "40%" }}
/>
</ParallaxLayer>
</Parallax>
</div>
);
}
to add images into our page.
When we click it, the this.parallax.scrollTo
method runs, and we’ll go to the image with the given offset.
Improve Performance
We can improve performance with various tweaks.
We can add the native
flag with expensive animations to improve animation performance.
For example, we can write:
import React from "react";
import { Spring, animated } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring native from={{ opacity: 0 }} to={{ opacity: 1 }}>
{(props) => <animated.div style={props}>hello</animated.div>}
</Spring>
</div>
);
}
We add the native
prop to improve the performance of our animation.
This prop can also be used for inner text animation:
import React from "react";
import { Spring, animated } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring native from={{ number: 0 }} to={{ number: 1 }}>
{(props) => <animated.div>{props.number}</animated.div>}
</Spring>
</div>
);
}
And we can use it with scrolling animation:
import React from "react";
import { Spring, animated } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring native from={{ scroll: 0 }} to={{ scroll: 250 }}>
{(props) => (
<animated.div
scrollTop={props.scroll}
style={{ overflowY: "scroll", height: 300 }}
>
{Array(100)
.fill()
.map((_, i) => (
<p key={i}>{i}</p>
))}
</animated.div>
)}
</Spring>
</div>
);
}
We can also use it with Trail
and Transition
components.
Interpolation
We can also use the native
prop with interpolation.
For example, we can write:
import React from "react";
import { Spring, animated, interpolate } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring
native
from={{ o: 0, xyz: [0, 0, 0], color: "red" }}
to={{ o: 1, xyz: [10, 20, 5], color: "green" }}
>
{({ o, xyz, color }) => (
<animated.div
style={{
color,
background: o.interpolate((o) => `rgba(210, 57, 77, ${o})`),
transform: xyz.interpolate(
(x, y, z) => `translate3d(${x}px, ${y}px, ${z}px)`
),
border: interpolate(
[o, color],
(o, c) => `${o * 10}px solid ${c}`
),
padding: o
.interpolate({ range: [0, 0.5, 1], output: [0, 0, 10] })
.interpolate((o) => `${o}%`),
opacity: o.interpolate([0.1, 0.2, 0.6, 1], [1, 0.1, 0.5, 1])
}}
>
{o.interpolate((n) => n.toFixed(2))}
</animated.div>
)}
</Spring>
</div>
);
}
We pass in a function to let us interpolate the styles for animation with the interpolate
method.
And we add the native
prop to speed that up.
Conclusion
We can add the native
prop to speed up our react-spring animation.
Also, we can add parallax scrolling with the Parallax
component.